// 7-5 英文单词排序 (15分)
// 本题要求编写程序，输入若干英文单词，对这些单词按长度从小到大排序后输出。如果长度相同，按照输入的顺序不变。

// 输入格式：
// 输入为若干英文单词，每行一个，以#作为输入结束标志。其中英文单词总数不超过20个，英文单词为长度小于10的仅由小写英文字母组成的字符串。

// 输出格式：
// 输出为排序后的结果，每个单词后面都额外输出一个空格。

// 输入样例：
// blue
// red
// yellow
// green
// purple
// #
// 输出样例：
// red blue green yellow purple 

#include <stdio.h>
#include <string.h>
#define NUM 20
#define LEN 10

char * s_gets(char * st, int n);
char * swapStr(char *st1, char *st2);
int main()
{
    char word[NUM][LEN];
    int idx = 0, min;
    while (idx < 20)
    {
        s_gets(word[idx], LEN);
        if (word[idx][0] == '#')
        {
            break;
        }
        idx++;
    }
    // 循环结束后，不管是否正常退出，idx的值均为读入的单词数量
    // 选择排序，比较单词长度，交换字符串
    for (int i = 0; i < idx - 1; i++)
    {
        min = i;
        for (int j = i + 1; j < idx; j++)
        {
            if (strlen(word[min]) > strlen(word[j]))
            {
                min = j;
            }
        }
        if (min != i) // min != i 表示min索引之后有比min索引处字符串长度还要小的
        {
            swapStr(word[min], word[i]);
        }
    }
    for (int i = 0; i < idx; i++)  // 这里的idx是读入的单词个数
    {
        printf("%s ", word[i]);
    }

    return 0;
}

char * s_gets(char * st, int n)
{
    char * ret_val;
    int i = 0;
    ret_val = fgets(st, n, stdin);

    if (ret_val)
    {
        while (st[i] != '\0' && st[i] != '\n')
        {
            i++;
        }
        if (st[i] == '\n')
        {
            st[i] = '\0';
        }
        else
        {
            while (getchar() != '\n')
            {
                continue;
            }
        }
    }

    return ret_val;
}

char * swapStr(char *st1, char *st2)
{
    char temp[LEN];
    strcpy(temp, st1);
    strcpy(st1, st2);
    strcpy(st2, temp);
    return st2;
}